
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Core/Data/TimeStamp.h"

#include "Usul/Factory/RegisterCreator.h"

using namespace Minerva::Core::Data;

USUL_FACTORY_REGISTER_CREATOR ( TimeStamp );

SERIALIZE_XML_DECLARE_TYPE_WRAPPER ( Minerva::Core::Data::Date );


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

TimeStamp::TimeStamp() : BaseClass(),
  _when ( boost::date_time::not_a_date_time )
{
  this->_addMember ( "when", _when );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

TimeStamp::TimeStamp ( const Date& date ) : BaseClass(),
  _when ( date )
{
  this->_addMember ( "when", _when );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

TimeStamp::~TimeStamp()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the date.
//
///////////////////////////////////////////////////////////////////////////////

void TimeStamp::when ( const Date& date )
{
  Guard guard ( this->mutex() );
  _when = date;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the date.
//
///////////////////////////////////////////////////////////////////////////////

TimeStamp::Date TimeStamp::when() const
{
  Guard guard ( this->mutex() );
  return _when;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Is this time stamp visible over this time period?
//
///////////////////////////////////////////////////////////////////////////////

bool TimeStamp::isVisible ( const boost::posix_time::time_period& period ) const
{
  return this->_isVisible ( this->when(), this->when(), period );
}
